n皇后问题思路分析即代码实现(有注释) 您所在的位置:网站首页 n皇后问题 回溯法c语言 n皇后问题思路分析即代码实现(有注释)

n皇后问题思路分析即代码实现(有注释)

2024-05-24 16:18| 来源: 网络整理| 查看: 265

n皇后问题 题目:

在n * n的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之在同一行、同一列、同一斜线上的棋子。设计算法在n * n的期盼上放置n个皇后,使其彼此不受攻击。

思路分析:

核心思路: 以行为主导,去考虑每一行的皇后该放在哪一列,才能获得可行解。

n皇后问题解的形式: n元组 {x1, x2, … , xi , …, xn}, 分量xi表示第i行皇后放置的列位置(即i行xi列)

解空间组织结构: m叉树(m = n)

显约束(对解分量的取值范围的限定): 不同列(取值1 ~ n)

隐约束(能否得到问题的可行解或最优解做出的约束):

1)约束条件: 约束条件是对可行解做出的约束,在这里指第t个皇后的位置不能和前t - 1 个皇后同列、同斜线。

2)限界条件: 限界条件是对最优解做出的约束,该问题不是求最优值,只是求可行方案,因此不需要限界条件。

具体搜索过程:

​ 从根开始,以深度优先搜索的方式进行搜索。根节点是活结点,并且以该活结点为当前扩展结点。当前扩展结点沿纵深方向扩展出一个新结点,判断该结点是否满足约束条件。如果满足,则该新节点变成活结点,并且成为当前的扩展结点,继续向深层搜索;如果不满足约束条件,则该新结点变成死结点,然后换到该新结点的兄弟结点继续搜索,如果新结点没有兄弟结点,或其兄弟结点已经全部搜索完毕,则当前扩展结点变成死结点,搜索回溯到当前扩展结点的父结点继续进行。搜索过程直到根节点变成死结点为止,即搜索完毕。

实现约束条件的约数函数:

//约束函数(检查当前第x行皇后放好后,是否满足约束条件) int place(int x){ if(x == 1)return 1; //第1行的皇后可以随便放 for(int i = 1; i if(x == 1)return 1; //第1行的皇后可以随便放 for(int i = 1; i //递归到第n + 1 行,说明是一个可行解 if(u == n + 1){ flag = 1; for(int i = 1; i dfs(u + 1); } } } int main(){ printf("请输入n皇后的个数n:"); scanf("%d", &n); dfs(1); if(!flag)printf("no solute!\n"); return 0; }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有